//
//  PKMusicPlayer.m
//  MusicDemo
//
//  Created by lanou on 15/12/24.
//  Copyright © 2015年 小明. All rights reserved.
//

#import "PKMusicPlayer.h"
#import <AVFoundation/AVFoundation.h>
@interface PKMusicPlayer ()


@property (strong, nonatomic) AVPlayer *player; // 音乐播放器




@end

@implementation PKMusicPlayer

+ (instancetype)sharePlayer
{
    static PKMusicPlayer *player = nil;

    // 系统写的代码块 , 输入dispatch_once即可
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        player = [[PKMusicPlayer alloc]init];
    });
    
    return player;
}


- (instancetype)init
{
    self = [super init];
    if (self) {
        
        _player = [[AVPlayer alloc] init];
        _index = 0;
    }
    
    return self;
}

// 重写set数组方法
-(void)setMusicArray:(NSArray *)musicArray
{
    
    
    _musicArray = musicArray;
    
    // 相当于给音乐播放器的数组赋值的时候,同时会 设置播放器 默认播放的歌曲为第一首
    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:[NSURL URLWithString:_musicArray[_index]]];
    // 替换item
    [_player replaceCurrentItemWithPlayerItem:item];
    
}


-(BOOL)isPlaying
{
    /* rate 属性表示 : indicates the current rate of playback; 0.0 means "stopped", 1.0 means "play at the natural rate of the current item" */

    if (_player.rate == 1.0) {
        
        return YES;
    } else {
        
        return NO;
    }
    
    
}


// 播放完毕之后的操作
- (void)finishPlay
{
    if (_playType == Random) {
        
        // 如果是单曲循环,播放结束后,让它跳到0
        [self seekToTime:0];
        
    } else {
        // 列表/随机 都是播放下一首,具体的操作,交给next方法
        [self nextMusic];
    }
    
}




-(void)beforeMusic
{
    _index--;
    if (_index == -1) {
        // 说明从第一首往前,那就跳到最后一首
        _index = _musicArray.count - 1;
    }
    
    if (_playType == Random) {
        _index = arc4random()%_musicArray.count;
    }
    
    
   [self changeMusicWithIndex:_index];// 点了上一首就会自动播放
}

- (void)nextMusic
{
    _index++;
    if (_index == _musicArray.count) {
        // 说明最后一首了,那就跳到第一首
        _index = 0;
    }
    
    if (_playType == Random) {
        _index = arc4random()%_musicArray.count;
    }
    
    
    [self changeMusicWithIndex:_index];
    // 点了下一首就会自动播放
    
}

- (void)play
{
    [_player play];
}

- (void)pause
{
    [_player pause];
}


- (void)seekToTime:(NSInteger)newTime
{
    
    /*
     CMTimeValue	value;	// 总帧数
     CMTimeScale	timescale;	// 每秒有多少帧
     
     公式:
     value/timescale = seconds  // 可以计算播放second秒
     value = timescale * seconds

     例子:10000帧的音频 , 每秒50帧 , 那么可以播放 200秒
     那么 我要跳到100秒的时候,需要100*50帧

     */
    // 获得当前的时间
    // 这样修改的方式,类似修改frame的方式,是对结构体的修改
    CMTime currentTime = _player.currentTime;
    currentTime.value = newTime * currentTime.timescale; // 秒*平均帧 = 总帧(就是我们要去的那个位置的帧数)
    [_player seekToTime:currentTime];
    
}

- (void)stop
{
    // 暂停
    [self pause];
    
    // 把时间跳0
    [self seekToTime:0];
    
}


// 获取 当前的时间 (秒) 重写GET方法
- (NSInteger)currentTime
{
    if (_player.currentTime.timescale == 0) {
        // 在网络状态不好的情况下,获取不到当前的时间,所以分母为0, 保护一下;
        return 0;
    }
    
    // 当前时间的帧数 / 当前时间的每秒帧 = 当前时间
    return _player.currentTime.value / _player.currentTime.timescale;
    
}

// 获取总时间
- (NSInteger)finishTime
{
    CMTime time = _player.currentItem.duration;
    
    if (time.timescale == 0) {
        
        return 0;
    }
    
    // 总帧数 / 每秒帧 = 总秒数
    return time.value / time.timescale;
}

// 根据(前面传过来的index)下标 来 播放歌曲
- (void)changeMusicWithIndex:(NSInteger)index
{
    // 保存传过来的index,上面方法里所需的的_index全部改为 传过来的index
    _index = index;
    NSURL *url = [NSURL URLWithString:_musicArray[index]];
    AVPlayerItem *item = [[AVPlayerItem alloc]initWithURL:url];
    [_player replaceCurrentItemWithPlayerItem:item];
    
    [_player play];
}





@end
